运行一个参数范围的所有唯一组合的模拟 您所在的位置:网站首页 参数的重要性 唯一 运行一个参数范围的所有唯一组合的模拟

运行一个参数范围的所有唯一组合的模拟

2023-12-16 13:45| 来源: 网络整理| 查看: 265

注意:为了避免大量滚动,这个答案中的代码相当紧凑。您可能需要添加一些额外的空格和换行。

你知道怎么做!你的代码看起来非常漂亮和干净!

但是,这伤害了我MATLAB的眼睛:

for i = up_down_ratio_arr for j = traffic_load_arr for k = blocked_modes_ind_arr for l = traffic_model_arr counter = counter + 1; parameters(counter, 1) = i; parameters(counter, 2) = j; parameters(counter, 3) = k; parameters(counter, 4) = l; end end end end

这是一个很好的例子,说明应该不使用循环.有一件事更让人伤脑筋的是,我显然无法做出一种更快的矢量化方法。它看起来很慢的原因是因为我尝试用tic/toc来计时它。

小贴士:在基准测试时不要使用tic/toc,使用高级timeit!当使用timeit进行基准测试时,我得到了非常有利于矢量化的结果。(麻黄)

函数中的矢量化方法(creds到路易斯·门多),因此我可以对其进行计时:

function parameters = vectorized_approach(up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr) vectors = {up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr}; n = numel(vectors); %// number of vectors parameters = cell(1,n); %// pre-define to generate comma-separated list [parameters{end:-1:1}] = ndgrid(vectors{end:-1:1}); %// the reverse order in these two %// comma-separated lists is needed to produce the rows of the result matrix in %// lexicographical order parameters = cat(n+1, parameters{:}); %// concat the n n-dim arrays along dimension n+1 parameters = reshape(parameters,[],n); end

循环方法放在函数loop_approach中(我不会在这里重复)。

up_down_ratio_arr = [1]; traffic_load_arr = [ 0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10, 100, Inf ]; blocked_modes_ind_arr = [1 2 3]; traffic_model_arr = [1 2]; f = @() loop_approach(up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr); g = @() vectorized_approach(up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr); isequal(f(),g()) ans = 1 timeit(f)/timeit(g) ans = 1.6072

因此,对于您的输入变量,矢量化方法比循环快60%左右。让我们让up_down_ratio_arr再长一点:

up_down_ratio_arr = [1:5]; f = @() loop_approach(up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr); g = @() vectorized_approach(up_down_ratio_arr, traffic_load_arr, blocked_modes_ind_arr, traffic_model_arr); isequal(f(),g()) ans = 1 timeit(f)/timeit(g) ans = 7.2192

因此,矢量化方法对于您在问题中发布的数据要快得多,对于较大的数据集则要快得多。

让我们继续:

一般情况下,numel比length,至少对于长向量。我建议你习惯每次使用它!

这一点可以简化:

if ind == 0 ind = uniq; end

这做了同样的工作,并且避免了if:ind(ind == 0) = uniq;。

我不认为我会在函数调用中执行ceil(sim_ind/uniq)。我建议您计算这个值,并给它一个描述性的名称(可能与调用的函数相同)。然后使用该变量作为输入参数。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有